package gestoremulte.pack;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

public class MyDatabase {  

    SQLiteDatabase mDb;
    DbHelper mDbHelper;
    Context mContext;
    private static final String DB_NAME="GestioneMultedb";//nome del db
    private static final int DB_VERSION=1; //numero di versione del db
   
    public MyDatabase(Context ctx){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
    }
   
    public void open(){  //il database su cui agiamo è leggibile/scrivibile
            mDb=mDbHelper.getWritableDatabase();
            //mDb.execSQL("DROP TABLE IF EXISTS VERBALI");
            mDb.execSQL(VERBALI_TABLE_CREATE);
            mDb.execSQL(NVERBALI_TABLE_CREATE);
            mDb.execSQL(NOTIFICA_TABLE_CREATE);
            //mDb.delete("VERBALI", null, null);
            
            

           
    }
   
    public void close(){ //chiudiamo il database su cui agiamo
            mDb.close();
    }
   
   
    //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
   // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento

   
    public void insertVerbale(Verbale verbale){ //metodo per inserire i dati
	
            ContentValues cv=new ContentValues();
            cv.put("numeroVerbale", verbale.getNumeroVerbale());
            cv.put("data_ora", verbale.getData_ora());
            cv.put("luogoTrasgressione", verbale.getLuogoTrasgressione());
            cv.put("sottoscritti", verbale.getSottoscritti());
            cv.put("nome_cognome_trasgressore", verbale.getNome_cognome_trasgressore());
            cv.put("NascitaTrasgressore", verbale.getNascitaTrasgressore());
            cv.put("ProvNascitaTrasgr", verbale.getProvNascitaTrasgr());
            cv.put("DataNascitaTrasgr", verbale.getDataNascitaTrasgr());
            cv.put("residenzaTrasgr", verbale.getResidenzaTrasgr());
            cv.put("provResidenzaTrasgr", verbale.getProvResidenzaTrasgr());
            cv.put("documento", verbale.getDocumento());
            cv.put("nDocTrasgr", verbale.getnDocTrasgr());
            cv.put("documentoRilasciatoData", verbale.getDocumentoRilasciatoData());
            cv.put("documentoRilasciatoDa", verbale.getDocumentoRilasciatoDa());
            cv.put("veicolo", verbale.getVeicolo());
            cv.put("targa", verbale.getTarga());
            cv.put("nome_cognome_possessore", verbale.getNome_cognome_possessore());
            cv.put("NascitaPossessore", verbale.getNascitaPossessore());
            cv.put("ProvNascitaPoss", verbale.getProvNascitaPoss());
            cv.put("DataNascitaPoss", verbale.getDataNascitaPoss());
            cv.put("residenzaPoss", verbale.getResidenzaPoss());
            cv.put("provResidenzaPoss", verbale.getProvResidenzaPoss());
            cv.put("violazioni", verbale.getViolazioni());
            cv.put("dichiara", verbale.getDichiara());
            cv.put("sanzione", verbale.getSanzione());
            cv.put("lat", verbale.getLat());
            cv.put("lon", verbale.getLon());
            if(mDb.insert("VERBALI", null, cv)!=-1){
            	Toast toast =Toast.makeText(mContext, "Verbale Salvato",Toast.LENGTH_SHORT);
            	toast.show();
            }
            else if(mDb.update("VERBALI", cv, "numeroVerbale="+verbale.getNumeroVerbale() , null)==1){
            	Toast toast =Toast.makeText(mContext, "Verbale modificato",Toast.LENGTH_LONG);
    			toast.show();
            }
            else{
            	Toast toast =Toast.makeText(mContext, "Errore nel salvataggio del Verbale",Toast.LENGTH_LONG);
    			toast.show();
            }
    }
    
    public void insertNVerbale(String nVerbale){
    	ContentValues cv=new ContentValues();
    	cv.put("numeroVerbale", nVerbale);
    	cv.put("used", 0);
    	if(mDb.insert("NVERBALI", null, cv)==-1){
        	Log.e("Verbale non inserito nel db", "nverbale");
        }
    }
   
    public Cursor fetchProducts_Verbali(){ //metodo per fare la query di tutti i dati
            return mDb.query("VERBALI", null,null,null,null,null,null);      
            
    }
    
    
    
    public void updateNVerbale (String nverbale, int used){
    	ContentValues args = new ContentValues();
    	args.put("used", used);

    	int s =mDb.update("NVERBALI", args, "numeroVerbale="+nverbale , null);
    	Log.e("FATTO", ""+s);
    }
    
    public Cursor fetchProductsNVerbali(){
    	return mDb.query("NVERBALI", null,"used=0",null,null,null,null);
    	
    }
    
    public String getfirstVerbale(){
    	
    	String verb = null;
    	Cursor c = mDb.query("NVERBALI", null,"used=0",null,null,null,null);
    	
    	
        
        if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
            do {
                        
            	 if (c.getInt(2) == 0){
            		 verb = c.getString(1);
            		 break;
            	 }
            	
            	            
             } while (c.moveToNext());
        }
        
        return verb;
    }
    
    public void insertNotifica(Notifica n){
    	ContentValues cv=new ContentValues();
    	cv.put("numeroVerbale",n.getVerbaleNumber() );
    	cv.put("data_ora",n.getData_ora() );
    	cv.put("via_comune",n.getVia_comune() );
    	cv.put("sanzione",n.getSanzione() );
    	cv.put("targa",n.getTarga() );
    	cv.put("infrazioni", convertArraytoString(n.getDescrizioneInfrazioni()));
    	cv.put("codici", convertArraytoString(n.getInfrazioni()));
    	cv.put("lat", n.getLat());
    	cv.put("lon",n.getLon() );
    	if(mDb.insert("NOTIFICA", null, cv)!=-1){
    		Toast toast =Toast.makeText(mContext, "Notifica salvata",Toast.LENGTH_LONG);
			toast.show();
        }
    	else if (mDb.update("NOTIFICA", cv, "numeroVerbale="+n.getVerbaleNumber() , null)==1){
    		
    		Toast toast =Toast.makeText(mContext, "Notifica modificata",Toast.LENGTH_LONG);
			toast.show();
    	}
    	
    	else{
    		Toast toast =Toast.makeText(mContext, "Errore nel salvataggio della notifica",Toast.LENGTH_LONG);
			toast.show();
    	}
    }
    
    
    private String convertArraytoString(ArrayList<String> c){
    	
    	String f = "";
    	f = c.toString();
    	//Log.e("STRINGA", f.substring(1, f.length()-1));
    	return f.substring(1, f.length()-1);
    }
    
    public List<HashMap<String, String>> loadNotifiche_Verbali(){
    	
    	
    	List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
    	
    	Cursor c = mDb.query("NOTIFICA", new String[]{"numeroVerbale","data_ora"},null,null,null,null,null);
    	
    	if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
            do {
            	HashMap<String, String> map = new HashMap<String, String>();
            	map.put("gender", "Notifica");
            	map.put("nverb", c.getString(0));
            	map.put("data_ora", c.getString(1));
            	fillMaps.add(map);
            	
            	            
             } while (c.moveToNext());
        }
    	
    	c = mDb.query("VERBALI", new String[]{"numeroVerbale","data_ora"},null,null,null,null,null);
    	
    	if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
            do {
            	HashMap<String, String> map = new HashMap<String, String>();
            	map.put("gender", "Verbale");
            	map.put("nverb", c.getString(0));
            	map.put("data_ora", c.getString(1));
            	fillMaps.add(map);
            	
            	            
             } while (c.moveToNext());
        }
    	
    	return fillMaps;
    }
    
    public Verbale getVerbale(String nVerbale){
    	Cursor c = mDb.query("VERBALI", null,"numeroVerbale="+nVerbale,null,null,null,null); 
    	
    	Verbale v = null;
    	if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
            do {
            	v = new Verbale (c.getString(1),c.getString(2),c.getString(3),
            			c.getString(4),c.getString(5),c.getString(6),c.getString(7),c.getString(8),
            			c.getString(9),c.getString(10),c.getString(11),
            			c.getString(12),c.getString(13),c.getString(14),
            			c.getString(15),c.getString(16),c.getString(17),
            			c.getString(18),c.getString(19),c.getString(20),
            			c.getString(21),c.getString(22),c.getString(23),
            			c.getString(24),c.getDouble(25),"","","","",c.getDouble(26), c.getDouble(27));
            }while (c.moveToNext());
    	}
        return v;
    }
    
    public Notifica getNotifica(String nverb){
    	Cursor c = mDb.query("NOTIFICA", null,"numeroVerbale="+nverb,null,null,null,null);
    	Notifica n = null;
    	if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
            do {
                String infrazionis[] = c.getString(6).split(",");
                String codicis[] = c.getString(7).split(",");
                ArrayList<String> inf = new ArrayList<String>();
                ArrayList<String> cod = new ArrayList<String>();
                Collections.addAll(inf, infrazionis); 
                Collections.addAll(cod, codicis); 
            	n = new Notifica(c.getString(2), c.getString(3),c.getDouble(4), c.getString(1), c.getString(5),cod,inf,"","","","",c.getDouble(8), c.getDouble(9));
            	
            	
            	            
             } while (c.moveToNext());
        }
    	return n;
    }
    
    public void deleteNotifica(String nverb){
    	mDb.delete("NOTIFICA","numeroVerbale="+nverb, null);
    }
    
    public void deleteVerbale(String nverb){
    	mDb.delete("VERBALI","numeroVerbale="+nverb, null);
    }
   

    private static final String VERBALI_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                    + "VERBALI" + " (" 
                    + "_id integer primary key autoincrement,"
                    + "numeroVerbale text unique not null,"
                    +"data_ora text not null,"
                    +"luogoTrasgressione text not null,"
                    +"sottoscritti text not null,"
                    +"nome_cognome_trasgressore text not null,"
                    +"NascitaTrasgressore text not null,"
                    +"ProvNascitaTrasgr text not null,"
                    +"DataNascitaTrasgr text not null,"
                    +"residenzaTrasgr text not null,"
                    +"provResidenzaTrasgr text not null,"
                    +"documento text not null,"
                    +"nDocTrasgr text not null,"
                    +"documentoRilasciatoData text not null,"
                    +"documentoRilasciatoDa text not null,"
                    +"veicolo text not null,"
                    +"targa text not null,"
                    +"nome_cognome_possessore text not null,"
                    +"NascitaPossessore text not null,"
                    +"ProvNascitaPoss text not null,"
                    +"DataNascitaPoss text not null,"
                    +"residenzaPoss text not null,"
                    +"provResidenzaPoss text not null,"
                    +"violazioni text not null,"
                    +"dichiara text not null,"
                    +"sanzione double not null,"
                    + "lat double default 1000,"
                    + "lon double default 1000"
                    +");";
    
    private static final String NVERBALI_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " 
    				+ "NVERBALI" + " ("
    				+ "_id integer primary key autoincrement,"
    				+ "numeroVerbale text unique not null,"
    				+ "used integer not null);";
    
    
    private static final String NOTIFICA_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " 
			+ "NOTIFICA" + " ("
			+ "_id integer primary key autoincrement,"
			+ "numeroVerbale text unique not null,"
			+ "data_ora text not null,"
			+ "via_comune text not null,"
			+ "sanzione double not null,"
			+ "targa text not null,"
			+ "infrazioni text not null,"
			+ "codici text not null,"
			+ "lat double default 1000,"
			+ "lon double default 1000"
			+ ");";

    private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

            public DbHelper(Context context, String name, CursorFactory factory,int version) {
                    super(context, name, factory, version);
            }

            @Override
            public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
            	
    
            	_db.execSQL(VERBALI_TABLE_CREATE);
            	_db.execSQL(NVERBALI_TABLE_CREATE);
            	_db.execSQL(NOTIFICA_TABLE_CREATE);
                    
            }

            @Override
            public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                    //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

            }
            @Override
            public void onOpen (SQLiteDatabase db){
            	
            	db.execSQL(VERBALI_TABLE_CREATE);
            	db.execSQL(NVERBALI_TABLE_CREATE);
            	db.execSQL(NOTIFICA_TABLE_CREATE);
            }
            

    }
    
    
           

}